[ConstantFold] Allow all float types in reinterpret load folding
authorNikita Popov <npopov@redhat.com>
Fri, 21 Jan 2022 08:23:41 +0000 (09:23 +0100)
committerNikita Popov <npopov@redhat.com>
Fri, 21 Jan 2022 08:26:51 +0000 (09:26 +0100)
Rather than hardcoding just half, float and double, allow all
floating point types.

llvm/lib/Analysis/ConstantFolding.cpp
llvm/test/Transforms/InstSimplify/ConstProp/loads.ll

index c834ecf..38c9cc7 100644 (file)
@@ -557,8 +557,8 @@ Constant *FoldReinterpretLoadFromConst(Constant *C, Type *LoadTy,
     // then bitcast the result.  This can be useful for union cases.  Note
     // that address spaces don't matter here since we're not going to result in
     // an actual new load.
-    if (!LoadTy->isHalfTy() && !LoadTy->isFloatTy() && !LoadTy->isDoubleTy() &&
-        !LoadTy->isPointerTy() && !LoadTy->isVectorTy())
+    if (!LoadTy->isFloatingPointTy() && !LoadTy->isPointerTy() &&
+        !LoadTy->isVectorTy())
       return nullptr;
 
     Type *MapTy = Type::getIntNTy(
index 43038bc..5e28f16 100644 (file)
@@ -112,36 +112,44 @@ define i128 @test_i128() {
 }
 
 define fp128 @test_fp128() {
-; CHECK-LABEL: @test_fp128(
-; CHECK-NEXT:    [[R:%.*]] = load fp128, fp128* bitcast ({ i64, i64 }* @g3 to fp128*), align 16
-; CHECK-NEXT:    ret fp128 [[R]]
+; LE-LABEL: @test_fp128(
+; LE-NEXT:    ret fp128 0xL000000000000007B0000000006B1BFF8
+;
+; BE-LABEL: @test_fp128(
+; BE-NEXT:    ret fp128 0xL0000000006B1BFF8000000000000007B
 ;
   %r = load fp128, fp128* bitcast({i64, i64}* @g3 to fp128*)
   ret fp128 %r
 }
 
 define ppc_fp128 @test_ppc_fp128() {
-; CHECK-LABEL: @test_ppc_fp128(
-; CHECK-NEXT:    [[R:%.*]] = load ppc_fp128, ppc_fp128* bitcast ({ i64, i64 }* @g3 to ppc_fp128*), align 16
-; CHECK-NEXT:    ret ppc_fp128 [[R]]
+; LE-LABEL: @test_ppc_fp128(
+; LE-NEXT:    ret ppc_fp128 bitcast (i128 2071796475790618158476296315 to ppc_fp128)
+;
+; BE-LABEL: @test_ppc_fp128(
+; BE-NEXT:    ret ppc_fp128 bitcast (i128 2268949521066387161080 to ppc_fp128)
 ;
   %r = load ppc_fp128, ppc_fp128* bitcast({i64, i64}* @g3 to ppc_fp128*)
   ret ppc_fp128 %r
 }
 
 define x86_fp80 @test_x86_fp80() {
-; CHECK-LABEL: @test_x86_fp80(
-; CHECK-NEXT:    [[R:%.*]] = load x86_fp80, x86_fp80* bitcast ({ i64, i64 }* @g3 to x86_fp80*), align 16
-; CHECK-NEXT:    ret x86_fp80 [[R]]
+; LE-LABEL: @test_x86_fp80(
+; LE-NEXT:    ret x86_fp80 0xKFFFF000000000000007B
+;
+; BE-LABEL: @test_x86_fp80(
+; BE-NEXT:    ret x86_fp80 0xK000000000000007B0000
 ;
   %r = load x86_fp80, x86_fp80* bitcast({i64, i64}* @g3 to x86_fp80*)
   ret x86_fp80 %r
 }
 
 define bfloat @test_bfloat() {
-; CHECK-LABEL: @test_bfloat(
-; CHECK-NEXT:    [[R:%.*]] = load bfloat, bfloat* bitcast ({ i64, i64 }* @g3 to bfloat*), align 2
-; CHECK-NEXT:    ret bfloat [[R]]
+; LE-LABEL: @test_bfloat(
+; LE-NEXT:    ret bfloat 0xR007B
+;
+; BE-LABEL: @test_bfloat(
+; BE-NEXT:    ret bfloat 0xR0000
 ;
   %r = load bfloat, bfloat* bitcast({i64, i64}* @g3 to bfloat*)
   ret bfloat %r