Endilll wrote:

Shafik contacted me offline about a libc++ test failure this PR causes. The 
test in question is `mem.res.eq/not_equal_pass.cpp`.
I reduced it down to the following:
```cpp
struct memory_resource {
  virtual ~memory_resource();
  bool is_equal(const memory_resource &) const noexcept;
};

inline bool operator==(const memory_resource &__lhs, const memory_resource 
&__rhs) {
  return &__lhs == &__rhs || __lhs.is_equal(__rhs);
  //     ^^^^^^^^^^^^^^^^ frontend built from this branch believes that this is 
never true         
}

void __assert_fail();

struct TestResourceImp : memory_resource {
  memory_resource do_is_equal_other;

  virtual bool do_is_equal() noexcept {
    return dynamic_cast<TestResourceImp *>(&do_is_equal_other);
  }
};

int main() {
  memory_resource mr1, mr2;
  mr1 != mr2 ? void() : __assert_fail();
}
```
Clang built from this branch produces the following IR for `operator==`
```llvm
; Function Attrs: mustprogress noinline nounwind optnone uwtable
define linkonce_odr dso_local noundef zeroext i1 
@_ZeqRK15memory_resourceS1_(ptr noundef nonnull align 8 dereferenceable(8) 
%__lhs, ptr noundef nonnull align 8 dereferenceable(8) %__rhs) #1 comdat {
entry:
  %__lhs.addr = alloca ptr, align 8
  %__rhs.addr = alloca ptr, align 8
  store ptr %__lhs, ptr %__lhs.addr, align 8
  store ptr %__rhs, ptr %__rhs.addr, align 8
  %0 = load ptr, ptr %__lhs.addr, align 8
  %1 = load ptr, ptr %__rhs.addr, align 8
  %call = call noundef zeroext i1 @_ZNK15memory_resource8is_equalERKS_(ptr 
noundef nonnull align 8 dereferenceable(8) %0, ptr noundef nonnull align 8 
dereferenceable(8) %1) #4
  ret i1 %call
}
```
Whereas a recent nighly build 
(`++20240704100628+b298e2d2d225-1~exp1~20240704220819.2190`) properly lowers 
the LHS of the logical OR:
```llvm
; Function Attrs: mustprogress noinline nounwind optnone uwtable
define linkonce_odr dso_local noundef zeroext i1 
@_ZeqRK15memory_resourceS1_(ptr noundef nonnull align 8 dereferenceable(8) 
%__lhs, ptr noundef nonnull align 8 dereferenceable(8) %__rhs) #1 comdat {
entry:
  %__lhs.addr = alloca ptr, align 8
  %__rhs.addr = alloca ptr, align 8
  store ptr %__lhs, ptr %__lhs.addr, align 8
  store ptr %__rhs, ptr %__rhs.addr, align 8
  %0 = load ptr, ptr %__lhs.addr, align 8
  %1 = load ptr, ptr %__rhs.addr, align 8
  %cmp = icmp eq ptr %0, %1
  br i1 %cmp, label %lor.end, label %lor.rhs

lor.rhs:                                          ; preds = %entry
  %2 = load ptr, ptr %__lhs.addr, align 8
  %3 = load ptr, ptr %__rhs.addr, align 8
  %call = call noundef zeroext i1 @_ZNK15memory_resource8is_equalERKS_(ptr 
noundef nonnull align 8 dereferenceable(8) %2, ptr noundef nonnull align 8 
dereferenceable(8) %3) #4
  br label %lor.end

lor.end:                                          ; preds = %lor.rhs, %entry
  %4 = phi i1 [ true, %entry ], [ %call, %lor.rhs ]
  ret i1 %4
}
```

https://github.com/llvm/llvm-project/pull/95474
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to